﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;  // 用于最大最小值的计算

namespace 任务状态
{
    public class SparklineChart
    {
        private List<float> data;  // 用于存储曲线数据
        private int maxCapacity;   // 最大容量
        private int width;         // 图像宽度
        private int height;        // 图像高度
        private Color f_color;
        private Color b_color;

        // 构造函数，初始化数据列表和图像尺寸
        public SparklineChart(int maxCapacity, int width, int height)
        {
            this.data = new List<float>();
            this.maxCapacity = maxCapacity;
            this.width = width;
            this.height = height;
        }

        // 向曲线图添加新数据并返回绘制后的 Bitmap 对象
        public Bitmap AddDataAndGetBitmap(float newValue,Color fcolor,Color bcolor)
        {
            this.f_color=fcolor;
            this.b_color=bcolor;
            if (data.Count >= maxCapacity)
            {
                data.RemoveAt(0);  
            }
            data.Add(newValue); 
            return DrawSparkline();
        }

        // 绘制曲线并返回 Bitmap 对象
        private Bitmap DrawSparkline()
        {
            // 获取当前数据中的最大值和最小值
            float maxValue = data.Max();
            float minValue = data.Min();

            Bitmap bitmap = new Bitmap(width, height);

            // 创建一个 Graphics 对象用于绘制图像
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // 设置背景为白色
                g.Clear(b_color);

                // 设置抗锯齿模式
                g.SmoothingMode = SmoothingMode.AntiAlias;

                // 计算每个数据点之间的距离
                float step = (float)width / (data.Count - 1);

                // 创建画笔用于绘制曲线
                Pen linePen = new Pen(f_color, 1);

                // 绘制曲线
                for (int i = 0; i < data.Count - 1; i++)
                {
                    // 将数据从动态范围映射到 [height, 0] 的像素范围
                    float x1 = i * step;
                    float y1 = MapValueToHeight(data[i], minValue, maxValue);
                    float x2 = (i + 1) * step;
                    float y2 = MapValueToHeight(data[i + 1], minValue, maxValue);
                    g.DrawLine(linePen, x1, y1, x2, y2);
                }

                // 释放资源
                linePen.Dispose();
            }

            return bitmap;
        }

        // 将数据从 [minValue, maxValue] 动态映射到 [height, 0] 的范围
        private float MapValueToHeight(float value, float minValue, float maxValue)
        {
            if (maxValue == minValue)  // 避免除以零的情况
            {
                return height / 2;  // 如果所有值相同，则绘制在中间
            }
            return height - ((value - minValue) / (maxValue - minValue) * height);
        }
        // 获取最高值、最低值、平均值和实时值
        public Dictionary<string, float> GetStatistics()
        {
            if (data.Count == 0)
            {
                return new Dictionary<string, float>
                {
                    { "Max", 0 },
                    { "Min", 0 },
                    { "Average", 0 },
                    { "Latest", 0 }
                };
            }

            float maxValue = data.Max();
            float minValue = data.Min();
            float averageValue = data.Average();
            float latestValue = data.Last();

            return new Dictionary<string, float>
            {
                { "Max", maxValue },
                { "Min", minValue },
                { "Average", averageValue },
                { "Latest", latestValue }
            };
        }
    }
}
